﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
using System.IO;

namespace ExplorerKiller
{
    public partial class Form1 : Form
    {
        // 任务栏和图标状态跟踪
        private bool isTaskbarVisible = true;
        private bool isDesktopIconsVisible = true;
        private bool isStartButtonVisible = true;
        
        public Form1()
        {
            InitializeComponent();
        }
        
    private void ButtonClickEventHandler(
        object sender,
        Dictionary<string, string> pathMap,
        Dictionary<string, string> errorMsgMap,
        Dictionary<string, string> argumentsMap = null
        )
        {
            Button btn = sender as Button;
            try
            {
                var startInfo = new ProcessStartInfo()
                {
                    FileName = pathMap.TryGetValue(btn.Name, out string value)
                        ? value
                        : pathMap["default"],
                    Arguments = argumentsMap.TryGetValue(btn.Name, out string value2)
                        ? value2
                        : argumentsMap["default"],
                    UseShellExecute = true
                };
                Process.Start(startInfo);
            }
            catch (Exception ex)
            {
                string errorMsg = (errorMsgMap.TryGetValue(btn.Name, out string value3)
                        ? value3
                        : errorMsgMap["default"]);
                MessageBox.Show(
                    string.Format(errorMsg, ex.Message),
                    "错误",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error
                    );
            }
        }

        private void ExplorerButton_Click(object sender, EventArgs e)
        {
            var pathMap = new Dictionary<string, string>()
            {
                {"StartExplorerButton", "explorer.exe"},
                {"KillExplorerButton", "taskkill"}
            };

            var argumentsMap = new Dictionary<string, string>()
            {
                {"StartExplorerButton", "shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}"}, // 使用桌面视图CLSID启动Explorer
                {"KillExplorerButton", "/f /im explorer.exe"}
            };

            var errorMsgMap = new Dictionary<string, string>()
            {
                {"StartExplorerButton", "启动Explorer时发生错误：{0}"},
                {"KillExplorerButton", "结束Explorer时发生错误：{0}"},
            };

            ButtonClickEventHandler(sender, pathMap, errorMsgMap, argumentsMap);
        }

        private void ClearIconTempButton_Click(object sender, EventArgs e)
        {
            try
            {
                // 显示确认对话框
                DialogResult result = MessageBox.Show(
                    "此操作将清理 Windows 缩略图缓存。\n系统会临时关闭 Explorer，完成后会自动重启。\n是否继续？", 
                    "确认清理", 
                    MessageBoxButtons.YesNo, 
                    MessageBoxIcon.Question
                );
                
                if (result == DialogResult.Yes)
                {
                    // 记录清理前的状态
                    int filesToDeleteCount = SpecialValue.GetThumbCacheFiles().Length;
                    
                    if (filesToDeleteCount == 0)
                    {
                        MessageBox.Show("没有找到需要清理的缩略图缓存文件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }
                    
                    // 显示清理进度信息
                    MessageBox.Show($"即将清理 {filesToDeleteCount} 个缩略图缓存文件。\n清理过程中任务栏会暂时消失，请勿关闭此窗口。", "清理准备", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                    // 停止 Explorer 进程
                    Process[] explorerProcesses = Process.GetProcessesByName("explorer");
                    foreach (Process explorerProcess in explorerProcesses)
                    {
                        explorerProcess.Kill();
                    }
                    
                    // 等待 Explorer 完全终止
                    Thread.Sleep(1000);
                    
                    // 删除缩略图缓存文件
                    int deletedCount = 0;
                    int failedCount = 0;
                    foreach (string iconTempFile in SpecialValue.GetThumbCacheFiles())
                    {
                        try
                        {
                            if (File.Exists(iconTempFile))
                            {
                                File.Delete(iconTempFile);
                                deletedCount++;
                            }
                        }
                        catch (Exception ex)
                        {
                            // 记录删除失败的文件，但继续清理其他文件
                            Debug.WriteLine($"删除文件 {iconTempFile} 失败: {ex.Message}");
                            failedCount++;
                        }
                    }
                    
                    // 重启 Explorer
                    Process.Start("explorer.exe");
                    
                    // 显示清理结果
                    string message = $"图标缓存清理完成！\n成功删除: {deletedCount} 个文件\n删除失败: {failedCount} 个文件";
                    MessageBox.Show(message, "清理完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"清除图标缓存时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        // 隐藏/显示任务栏按钮点击事件
        private void HideTaskBarButton_Click(object sender, EventArgs e)
        {
            try
            {
                isTaskbarVisible = !isTaskbarVisible;
                NativeMethods.ShowTaskbar(isTaskbarVisible);
                
                // 更新按钮文本
                this.HideTaskBarButton.Text = isTaskbarVisible ? "隐藏任务栏" : "显示任务栏";
                
                // 显示操作结果提示
                string message = isTaskbarVisible ? "任务栏已显示" : "任务栏已隐藏";
                MessageBox.Show(message, "操作完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"操作任务栏时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        // 隐藏/显示桌面图标按钮点击事件
        private void HideDesktopIconButton_Click(object sender, EventArgs e)
        {
            try
            {
                isDesktopIconsVisible = !isDesktopIconsVisible;
                NativeMethods.ShowDesktopIcons(isDesktopIconsVisible);
                
                // 更新按钮文本
                this.HideDesktopIconButton.Text = isDesktopIconsVisible ? "隐藏桌面图标" : "显示桌面图标";
                
                // 显示操作结果提示
                string message = isDesktopIconsVisible ? "桌面图标已显示" : "桌面图标已隐藏";
                MessageBox.Show(message, "操作完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"操作桌面图标时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        // 隐藏/显示开始按钮（通过调整任务栏位置实现）
        private void HideStartButton_Click(object sender, EventArgs e)
        {
            try
            {
                isStartButtonVisible = !isStartButtonVisible;
                
                // 重命名按钮以避免混淆
                HideStartButton.Text = isStartButtonVisible ? "隐藏开始按钮" : "显示开始按钮";
                
                if (!isStartButtonVisible)
                {
                    // 实际隐藏开始按钮在现代Windows系统中较为复杂，这里仅提供提示
                    MessageBox.Show("注意：在现代Windows系统中完全隐藏开始按钮需要更复杂的操作。\n此功能仅作提示，实际效果可能有限。", 
                        "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("开始按钮已显示", "操作完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"操作开始按钮时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
